Cilium の持つネットワークを BIRD に取り込む
Why
Cilium の Native Routing はそれ自体ではノードを跨いだポッド間通信を提供しないため,ノードに割り振られたポッドの IP アドレスや(Cilium のloadBalancerClassを使うのなら)ロードバランサ IP アドレスを適切に広告してノード間通信を確保する必要がある L2 接続の場合に限った簡易的な確立は例外的に持っている
Cilium は現状ルーティングのデフォルトとなる構成を持たないが,何やらオピニオンを持って進めたいという方向性だけは感じるという状態になっている BIRD と使う例自体は存在するが,広告するべきアドレス(podCIDR)は自分で取ってきてコンフィグに入れる必要があり,実用性が怪しい もう1つの理由として,Cilium の gobgp 実装の内部状態が不明で正しく動作しているのかがわかりにくかったりするのを避けたいという気持ちがある Cilium 全体に言えることだが,機能実装を優先しすぎてユーザビリティをかなり犠牲にしている気がする How
localhost 内で Cilium の BGP デーモンと経路交換してネットワークを取り込む ポイント
マルチプロトコルにするとなぜかNEXT_HOPが異常な値(コネクションに使っているプロトコルの localhost)になってしまってコネクションに使っていない側のプロトコルの経路交換が壊れる
いかつい
multihopなコネクションにする
multihopにしないと L2 な接続であると考えて処理するが,L2 ではないので普通の L3 だと思って処理してもらう
passiveにする
BIRD の側から接続しようとすると Cilium のほうの準備ができるまでずっと繋ごうとしておかしくなる import filter で強制的にループバックに生えてる経路に書き換える
via 127.0.0.1なんていう経路はおかしいので,意味的に等価な経路にする
code:bgpp.yaml
apiVersion: cilium.io/v2alpha1
kind: CiliumBGPPeeringPolicy
metadata:
name: default
spec:
nodeSelector: {}
virtualRouters:
- exportPodCIDR: true
localASN: 100000
neighbors:
- peerASN: 100004
peerAddress: 127.0.0.1/32
- peerASN: 100006
peerAddress: ::1/128
code:bird.conf
protocol bgp cilium4 {
local as 100004;
neighbor 127.0.0.1 as 100000;
passive;
multihop;
ipv4 {
import filter {
ifname = "lo";
accept;
};
export none;
};
}
protocol bgp cilium6 {
local as 100006;
neighbor ::1 as 100000;
passive;
multihop;
ipv6 {
import filter {
ifname = "lo";
accept;
};
export none;
};
}
ネタ元
localhost で BGP をやるという発想がなかった!